/*
    封装实现一个SqliteHelper类，提供简单的sqlite数据库操作接口，完成数据的增删查改
    1.创建、打开数据库文件
    2.针对打开的数据库进行操作
        2.1.表的操作
        2.2.数据的操作
    3.关闭数据库
*/
#include <sqlite3.h>
#include <iostream>
#include <vector>
#include <string>

class SqliteHelper
{
    using SqliteCallback = int(void *, int, char **, char **);

public:
    SqliteHelper(const std::string &path)
        : _db_file_path(path),
          _handler(nullptr)
    {
    }
    bool open(int safe_level = SQLITE_OPEN_FULLMUTEX) // 设置串行化的安全等级
    {
        int ret = sqlite3_open_v2(_db_file_path.c_str(),                                   // 传入文件地址
                                  &_handler,                                               // 添加句柄
                                  SQLITE_OPEN_CREATE | SQLITE_OPEN_READWRITE | safe_level, // 打开方式
                                  nullptr);
        if (ret != SQLITE_OK)
        {
            std::cout << "open or create sqlite data base failed" << std::endl;
            std::cout << "error message is: [" << sqlite3_errmsg(_handler) << " ]" << std::endl;
            return false;
        }
        return true;
    }
    bool exec(const std::string &sql, SqliteCallback cb, void *arg)
    {
        int ret = sqlite3_exec(_handler, sql.c_str(), cb, arg, nullptr);
        if (ret != SQLITE_OK)
        {
            std::cout << "sql operation: [" << sql.c_str() << "] failed" << std::endl;
            std::cout << "error message is: [" << sqlite3_errmsg(_handler) << " ]" << std::endl;
            return false;
        }
        return true;
    }
    void close()
    {
        sqlite3_close_v2(_handler);
    }

private:
    std::string _db_file_path;
    sqlite3 *_handler;
};